import { getInfo, login, logout } from "@/api/login"
import config from "@/config"
import { getToken, removeToken, setToken } from "@/utils/auth"
import constant from "@/utils/constant"
import storage from "@/utils/storage"
import { isEmpty, isHttp } from "@/utils/validate"
import { defineStore } from "pinia"
import { ref } from "vue"

const baseUrl = config.baseUrl

export const useUserStore = defineStore("user", () => {
	const token = ref(getToken())
	const id = ref(storage.get(constant.id))
	const name = ref(storage.get(constant.name))
	const avatar = ref(storage.get(constant.avatar))
	const roles = ref(storage.get(constant.roles))
	const permissions = ref(storage.get(constant.permissions))

	const SET_TOKEN = val => {
		token.value = val
	}
	const SET_ID = val => {
		id.value = val
		storage.set(constant.id, val)
	}
	const SET_NAME = val => {
		name.value = val
		storage.set(constant.name, val)
	}
	const SET_AVATAR = val => {
		avatar.value = val
		storage.set(constant.avatar, val)
	}
	const SET_ROLES = val => {
		roles.value = val
		storage.set(constant.roles, val)
	}
	const SET_PERMISSIONS = val => {
		permissions.value = val
		storage.set(constant.permissions, val)
	}

	// 登录
	const loginAction = userInfo => {
		const username = userInfo.username.trim()
		const password = userInfo.password
		const code = userInfo.code
		const uuid = userInfo.uuid
		return new Promise((resolve, reject) => {
			login(username, password, code, uuid)
				.then(res => {
					setToken(res.token)
					SET_TOKEN(res.token)
					resolve()
				})
				.catch(error => {
					reject(error)
				})
		})
	}

	// 获取用户信息
	const getInfoAction = () => {
		return new Promise((resolve, reject) => {
			getInfo()
				.then(res => {
					const user = res.user
					let avatar = user.avatar || ""
					if (!isHttp(avatar)) {
						avatar = isEmpty(avatar) ? "" : baseUrl + avatar
					}
					const userid = isEmpty(user) || isEmpty(user.userId) ? "" : user.userId
					const username = isEmpty(user) || isEmpty(user.userName) ? "" : user.userName
					if (res.roles && res.roles.length > 0) {
						SET_ROLES(res.roles)
						SET_PERMISSIONS(res.permissions)
					} else {
						SET_ROLES(["ROLE_DEFAULT"])
					}
					SET_ID(userid)
					SET_NAME(username)
					SET_AVATAR(avatar)
					resolve(res)
				})
				.catch(error => {
					reject(error)
				})
		})
	}

	// 退出系统
	const logOutAction = () => {
		return new Promise((resolve, reject) => {
			logout(token.value)
				.then(() => {
					SET_TOKEN("")
					SET_ROLES([])
					SET_PERMISSIONS([])
					removeToken()
					storage.clean()
					resolve()
				})
				.catch(error => {
					reject(error)
				})
		})
	}

	return {
		token,
		id,
		name,
		avatar,
		roles,
		permissions,
		SET_AVATAR,
		login: loginAction,
		getInfo: getInfoAction,
		logOut: logOutAction,
	}
})
